home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
misc
/
amag
/
12b92.lha
/
Tips & Tricks
/
Dezimalstrings (Assembler)
/
Str2Long.asm
next >
Wrap
Assembly Source File
|
1992-11-02
|
2KB
|
53 lines
lea.l String(pc),a0 ; Beispiel
bsr.s Str2Long
rts
String DC.B "1000000",0
; == Str2Long ==
; == Eingabe: A0 - Zeiger auf den String mit der ==
; == positiven, ganzen Zahl. ==
; == Ausgabe: D0 - Zahl als Longword (sofern kein ==
; == kein Fehler auftrat) ==
; == D1 - enthält 0 bei fehlerfreier ==
; == Durchführung, 1 bei einem ==
; == Fehler und 2,falls die Zahl zu ==
; == groß ist. ==
; == A0 - zeigt bei fehlerfreier Durch- ==
; == führung auf das erste Zeichen ==
; == nach der Zahl ==
; == VORSICHT: Register D2 wird verwendet ! ==
Str2Long move.b (a0)+,d0 ; erstes Zeichen
sub.b #"0",d0 ; von ASCII-Code in Ziffer umwandeln
cmp.b #9,d0 ; größer als 9 ?
bhi.s Error ; erstes Zeichen ist keine Ziffer !
moveq.l #0,d1 ; alle Bits in D1 löschen
Loop move.b (a0)+,d1 ; nächste Ziffer
sub.b #"0",d1 ; von ASCII-Code in Ziffer umwandeln
cmp.b #9,d1 ; größer als 9 ?
bhi.s End ; Zeichen gehört nicht mehr zu Zahl
add.l d0,d0 ; Inhalt von D0 mit 10 multiplizieren:
bcs.s Overflow ; 10*D0 = 2^2*2*D0 + 2*D0
move.l d0,d2
add.l d2,d2
bcs.s Overflow ; Der MULU-Befehl kann nicht angewandt
add.l d2,d2 ; werden, da dieser nur 16-Bit-Zahlen
bcs.s Overflow ; multipliziert.
add.l d2,d0
bcs.s Overflow
add.l d1,d0 ; Ziffer addieren
bcc.s Loop ; Falls kein Overflow, gehe zu 'Loop'
Overflow moveq.l #2,d1 ; Zahl ist zu groß !
rts
End subq.l #1,a0 ; A0 zeigt das nächste Zeichen nach der Zahl
moveq.l #0,d1 ; es trat kein Fehler auf
rts
Error moveq.l #1,d1 ; Fehler !
rts